﻿/*****************************************************************//**
 * \file   EstunRemoteApiLib.h
 * \brief  
 * 
 * \author wanglei64101
 * \date   May 2022
 *********************************************************************/

#ifndef ESTUNREMOTEAPILIB_H
#define ESTUNREMOTEAPILIB_H

#include "EstunRemoteApiLib_global.h"
#include "EstunRemoteApiLib_struct.h"

using namespace EstunRobot;

class ESTUNREMOTEAPILIBAPI EstunRemoteApiLib
{
public:
	/**
	 * 类的构造和析构接口
	 * 
	 */
	EstunRemoteApiLib();
	~EstunRemoteApiLib();

	/**
	 * 是否输出本地日志.
	 * 
	 * \param enable 为true写本地日志，false则不写日志
	 */
	void setLogEnable(bool enable);

	/**
	 * 写本地日志.
	 *
	 * \param str 日志信息
	 */
	void writeLog(EstunRobot::ESString str);

	/**
	 * 获取最近一次错误的信息.
	 * 
	 * \return 错误信息字符串
	 */
	EstunRobot::ESString getLastErr() const;

	/**
	 * 连接服务器.
	 * 
	 * \param ipAddr 服务IP地址，IPV4格式
	 * \param isAutoReConnect 是否自动重连，如果为True，客户端在异常掉线时会自动重连，否则不会
	 * \return 成功返回true，失败返回false
	 */
	bool connectToServer(EstunRobot::ESString ipAddr, bool isAutoReConnect = false);

	/**
	 * 断开与服务的连接.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool disConnect();

	/**
	 * 检测是否已连接服务.
	 * 
	 * \return 连接返回true，断开返回false
	 */
	bool isConnected();

	/**
	 * 获取当前模式的工作状态.
	 * 
	 * \return -1表示失败，0表示正常，1表示机器人错误，2表示机器人处于停止状态，需要调用start接口启动
	 */
	int E_GetAPIStatus();

	/**
	 * 申请机器人运动操作权限.
	 * 
	 * \return 权限信息
	 */
	E_ROB_PERMIT E_AcquirePermit();

	/**
	 * 查询当前机器人运动操作权限.
	 *
	 * \return 权限信息
	 */
	E_ROB_PERMIT E_CurrentPermit();

	/**
	 * 释放机器人运动操作权限.
	 * 
	 * \param permit 之前获取的权限
	 * \return 成功返回true，失败返回false
	 */
	bool E_ReleasePermit(E_ROB_PERMIT permit);

	/**
	 * 唤醒机器人运动，从stop模式恢复.
	 *
	 * \return 成功返回true，失败返回false
	 */
	bool E_MotionStart();

	/**
	 * 暂停机器人运动，不会清空运动队列.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool E_MotionPause();

	/**
	 * 恢复机器人运动，继续执行运动队列.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool E_MotionContinue();

	/**
	 * 停止机器人运动，同时清空运动队列.
	 *
	 * \return 成功返回true，失败返回false
	 */
	bool E_MotionStop();

	/**
	 * 获取机器人运动状态.
	 * 
	 * \return 运动返回1，不运动返回0
	 */
	int E_GetRobotRunStatus();

	/**
	 * 执行MovJ指令.
	 * 
	 * \param Pname 目标位置点变量名， 例："t_g.p1"
	 * \param velName 运动速度变量名， 例："t_g.SPEED0"
	 * \param blendType 过渡类型，"", "Rel", "Abs"，三选一
	 * \param zame 过渡参数变量名， 例："t_g.ZONE0"
	 * \param tname 工具变量名， 例："t_g.TOOL1"
	 * \param coorname 坐标系变量名， 例："t_g.USER0"
	 * \param payloadName 负载变量名， 例："t_g. PAYLOAD0"
	 * \param addDo 附加指令，内容由其他结构体填充，需要调用AddDoTypeConvert的相关接口完成转换，目前仅支持E_ROB_ADDDO_IO类型
	 * \param valfine 到位精度值
	 * \param IsWaitFinish 是否等运动执行结束，为true则接口在运动执行到位后再返回，为false则立即返回
	 * \return 指令标识信息，id小于0为失败
	 */
	E_ROB_JOBID E_MovJ(EstunRobot::ESString Pname, EstunRobot::ESString velName = "", EstunRobot::ESString blendType = "", EstunRobot::ESString zame = "", EstunRobot::ESString tname = "", EstunRobot::ESString coorname = "", EstunRobot::ESString payloadName = "", const E_ROB_APIBUFF& addDo = E_ROB_APIBUFF(), double valfine = 0.0, bool IsWaitFinish = false);
	
	/**
	 * 执行MovJ2指令.
	 * 
	 * \param dstPoint 目标位置点
	 * \param velo 运行速度
	 * \param zone 过度参数
	 * \param payloadId 负载号
	 * \param toolId 工具号
	 * \param coordId 用户坐标号
	 * \param addDo 附加指令，内容由其他结构体填充，需要调用AddDoTypeConvert的相关接口完成转换，目前仅支持E_ROB_ADDDO_IO类型
	 * \param valfine 到位精度值
	 * \param IsWaitFinish 是否等运动执行结束，为true则接口在运动执行到位后再返回，为false则立即返回
	 * \return 指令标识信息，id小于0为失败
	 */
	E_ROB_JOBID E_MovJ2(const E_ROB_POS& dstPoint, const E_ROB_SPEED& velo = E_ROB_SPEED(), const E_ROB_ZONE& zone = E_ROB_ZONE(), int payloadId = 0, int toolId = 0, int coordId = 0, const E_ROB_APIBUFF& addDo = E_ROB_APIBUFF(), double valfine = 0.0, bool IsWaitFinish = false);

	/**
	 * 执行MovL指令.
	 * 
	 * \param Pname 目标位置点变量名， 例："t_g.p1"
	 * \param velName 运动速度变量名， 例："t_g.SPEED0"
	 * \param blendType 过渡类型，"", "Rel", "Abs"，三选一
	 * \param zame 过渡参数变量名， 例："t_g.ZONE0"
	 * \param tname 工具变量名， 例："t_g.TOOL1"
	 * \param coorname 坐标系变量名， 例："t_g.USER0"
	 * \param payloadName 负载变量名， 例："t_g. PAYLOAD0"
	 * \param overrideType 速率类型，"", "GOFF", "GON"，三选一
	 * \param addDo 附加指令，内容由其他结构体填充，需要调用AddDoTypeConvert的相关接口完成转换，目前仅支持E_ROB_ADDDO_IO类型
	 * \param valfine 到位精度值
	 * \param IsWaitFinish 是否等运动执行结束，为true则接口在运动执行到位后再返回，为false则立即返回
	 * \return 指令标识信息，id小于0为失败
	 */
	E_ROB_JOBID E_MovL(EstunRobot::ESString Pname, EstunRobot::ESString velName = "", EstunRobot::ESString blendType = "", EstunRobot::ESString zame = "", EstunRobot::ESString tname = "", EstunRobot::ESString coorname = "", EstunRobot::ESString payloadName = "", EstunRobot::ESString overrideType = "GON", const E_ROB_APIBUFF& addDo = E_ROB_APIBUFF(), double valfine = 0.0, bool IsWaitFinish = false);
	
	/**
	 * 执行MovL2指令.
	 * 
	 * \param dstPoint 目标位置点
	 * \param velo 运行速度
	 * \param zone 过度参数
	 * \param payloadId 负载号
	 * \param toolId 工具号
	 * \param coordId 用户坐标号
	 * \param overrideType 速率类型, 0:GOVROFF;1:GOVRON
	 * \param addDo 附加指令，内容由其他结构体填充，需要调用AddDoTypeConvert的相关接口完成转换，目前仅支持E_ROB_ADDDO_IO类型
	 * \param valfine 到位精度值
	 * \param IsWaitFinish 是否等运动执行结束，为true则接口在运动执行到位后再返回，为false则立即返回
	 * \return 指令标识信息，id小于0为失败
	 */
	E_ROB_JOBID E_MovL2(const E_ROB_POS& dstPoint, const E_ROB_SPEED& velo = E_ROB_SPEED(), const E_ROB_ZONE& zone = E_ROB_ZONE(), int payloadId = 0, int toolId = 0, int coordId = 0, int overrideType = 1, const E_ROB_APIBUFF& addDo = E_ROB_APIBUFF(), double valfine = 0.0, bool IsWaitFinish = false);

	/**
	 * 执行MovC指令.
	 * 
	 * \param PAuxname 辅助位置点变量名， 例："t_g.p0"
	 * \param PDstname 目标位置点变量名， 例："t_g.p1"
	 * \param velName 运动速度变量名， 例："t_g.SPEED0"
	 * \param blendType 过渡类型，"", "Rel", "Abs"，三选一
	 * \param zame 过渡参数变量名， 例："t_g.ZONE0"
	 * \param tname 工具变量名， 例："t_g.TOOL1"
	 * \param coorname 坐标系变量名， 例："t_g.USER0"
	 * \param payloadName 负载变量名， 例："t_g. PAYLOAD0"
	 * \param overrideType 速率类型，"", "GOFF", "GON"，三选一
	 * \param addDo 附加指令，内容由其他结构体填充，需要调用AddDoTypeConvert的相关接口完成转换，目前仅支持E_ROB_ADDDO_IO类型
	 * \param valfine 到位精度值
	 * \param IsWaitFinish 是否等运动执行结束，为true则接口在运动执行到位后再返回，为false则立即返回
	 * \return 指令标识信息，id小于0为失败
	 */
	E_ROB_JOBID E_MovC(EstunRobot::ESString PAuxname, EstunRobot::ESString PDstname, EstunRobot::ESString velName = "", EstunRobot::ESString blendType = "", EstunRobot::ESString zame = "", EstunRobot::ESString tname = "", EstunRobot::ESString coorname = "", EstunRobot::ESString payloadName = "", EstunRobot::ESString overrideType = "GON", const E_ROB_APIBUFF& addDo = E_ROB_APIBUFF(), double valfine = 0.0, bool IsWaitFinish = false);
	
	/**
	 * 执行MovC2指令.
	 * 
	 * \param auxP 辅助位置点
	 * \param dstPoint 目标位置点
	 * \param velo 运行速度
	 * \param zone 过度参数
	 * \param payloadId 负载号
	 * \param toolId 工具号
	 * \param coordId 用户坐标号
	 * \param overrideType 速率类型, 0:GOVROFF;1:GOVRON
	 * \param addDo 附加指令，内容由其他结构体填充，需要调用AddDoTypeConvert的相关接口完成转换，目前仅支持E_ROB_ADDDO_IO类型
	 * \param valfine 到位精度值
	 * \param IsWaitFinish 是否等运动执行结束，为true则接口在运动执行到位后再返回，为false则立即返回
	 * \return 指令标识信息，id小于0为失败
	 */
	E_ROB_JOBID E_MovC2(const E_ROB_POS& auxP, const E_ROB_POS& dstPoint, const E_ROB_SPEED& velo = E_ROB_SPEED(), const E_ROB_ZONE& zone = E_ROB_ZONE(), int payloadId = 0, int toolId = 0, int coordId = 0, int overrideType = 1, const E_ROB_APIBUFF& addDo = E_ROB_APIBUFF(), double valfine = 0.0, bool IsWaitFinish = false);

	/**
	 * 执行MovArch指令.
	 * 
	 * \param Pname 目标位置点变量名， 例："t_g.p1"
	 * \param velName 运动速度变量名， 例："t_g.SPEED0"
	 * \param blendType 过渡类型，"", "Rel", "Abs"，三选一
	 * \param zame 过渡参数变量名， 例："t_g.ZONE0"
	 * \param tname 工具变量名， 例："t_g.TOOL1"
	 * \param coorname 坐标系变量名， 例："t_g.USER0"
	 * \param payloadName 负载变量名， 例："t_g. PAYLOAD0"
	 * \param cornerName 拱形运动转角变量名， 例："t_g.ZONE1"
	 * \param height 抬升高度，单位毫米
	 * \param addDo 附加指令，内容由其他结构体填充，需要调用AddDoTypeConvert的相关接口完成转换，目前仅支持E_ROB_ADDDO_IO类型
	 * \param valfine 到位精度值
	 * \param IsWaitFinish 是否等运动执行结束，为true则接口在运动执行到位后再返回，为false则立即返回
	 * \return 指令标识信息，id小于0为失败
	 */
	E_ROB_JOBID E_MovArch(EstunRobot::ESString Pname, EstunRobot::ESString velName = "", EstunRobot::ESString blendType = "", EstunRobot::ESString zame = "", EstunRobot::ESString tname = "", EstunRobot::ESString coorname = "", EstunRobot::ESString payloadName = "", EstunRobot::ESString cornerName = "", double height = 0.0, const E_ROB_APIBUFF& addDo = E_ROB_APIBUFF(), double valfine = 0.0, bool IsWaitFinish = false);
	
	/**
	 * 执行MovArch2指令.
	 * 
	 * \param dstPoint 目标位置点
	 * \param velo 运行速度
	 * \param zone 过度参数
	 * \param connerZone 转角参数
	 * \param payloadId 负载号
	 * \param toolId 工具号
	 * \param coordId 用户坐标号
	 * \param heigt 抬升高度，单位毫米
	 * \param addDo 附加指令，内容由其他结构体填充，需要调用AddDoTypeConvert的相关接口完成转换，目前仅支持E_ROB_ADDDO_IO类型
	 * \param valfine 到位精度值
	 * \param IsWaitFinish 是否等运动执行结束，为true则接口在运动执行到位后再返回，为false则立即返回
	 * \return 指令标识信息，id小于0为失败
	 */
	E_ROB_JOBID E_MovArch2(const E_ROB_POS& dstPoint, const E_ROB_SPEED& velo = E_ROB_SPEED(), const E_ROB_ZONE& zone = E_ROB_ZONE(), const E_ROB_ZONE& connerZone = E_ROB_ZONE(), int payloadId = 0, int toolId = 0, int coordId = 0, double heigt = 0.0, const E_ROB_APIBUFF& addDo = E_ROB_APIBUFF(), double valfine = 0.0, bool IsWaitFinish = false);

	/**
	 * 创建工具坐标系.
	 * 
	 * \param toolID 新的工具号，必须大于0
	 * \param toolCoord 工具坐标参数
	 * \param payloadvalue 工具负载参数
	 * \return 成功返回true，失败返回false
	 */
	bool E_CreateTool(int toolID, const E_ROB_COORD & toolCoord, const E_ROB_PAYLOAD& payloadvalue);

	/**
	 * 修改工具坐标系.
	 * 
	 * \param toolID 要修改的工具号，必须大于0
	 * \param toolCoord 工具坐标参数
	 * \param payloadvalue 工具负载参数
	 * \return 成功返回true，失败返回false
	 */
	bool E_ModifyTool(int toolID, const E_ROB_COORD & toolCoord, const E_ROB_PAYLOAD& payloadvalue);

	/**
	 * 加载工具坐标系.
	 * 
	 * \param toolID 工具号，如果为0表示不加载
	 * \return 成功返回true，失败返回false
	 */
	bool E_LoadTool(int toolID);

	/**
	 * 获取当前工具号.
	 * 
	 * \return 工具号
	 */
	int E_GetCurToolID();

	/**
	 * 获取工具坐标系变量.
	 * 
	 * \param toolID 工具号
	 * \param toolCoord 工具参数，引用
	 * \param toolPayload 负载参数，引用
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetTool(int toolID, E_ROB_COORD& toolCoord, E_ROB_PAYLOAD& toolPayload);

	/**
	 * 创建用户坐标.
	 * 
	 * \param usrID 新的坐标号，必须大于0
	 * \param usrData 坐标参数
	 * \return 成功返回true，失败返回false
	 */
	bool E_CreateUserCoord(int usrID, const E_ROB_COORD& usrData);

	/**
	 * 修改用户坐标.
	 * 
	 * \param usrID 要修改的用户坐标号，必须大于0
	 * \param usrData 坐标参数
	 * \return 成功返回true，失败返回false
	 */
	bool E_ModifyUserCoord(int usrID, const E_ROB_COORD& usrData);

	/**
	 * 加载用户坐标.
	 * 
	 * \param usrID 用户坐标号，如果为0表示不加载
	 * \return 成功返回true，失败返回false
	 */
	bool E_LoadUserCoord(int usrID);

	/**
	 * 获取当前用户坐标号.
	 *
	 * \param coordtype 用户坐标类型，引用
	 * \return 用户坐标号
	 */
	int E_GetCurUserCoordID(E_UserCoordType& coordtype);

	/**
	 * 获取用户坐标信息.
	 * 
	 * \param coordID 用户坐标id
	 * \param coordtype 用户坐标类型
	 * \param coord 用户坐标参数，引用
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetUserCoord(int coordID, E_UserCoordType coordtype, E_ROB_COORD& coord);

	/**
	 * 创建负载.
	 * 
	 * \param payloadID 新的负载号，必须大于0
	 * \param payloadData 负载参数
	 * \return 成功返回true，失败返回false
	 */
	bool E_CreatePayLoad(int payloadID, const E_ROB_PAYLOAD& payloadData);

	/**
	 * 修改负载.
	 * 
	 * \param payloadID 要修改的负载号，必须大于0
	 * \param payloadData 负载参数
	 * \return 成功返回true，失败返回false
	 */
	bool E_ModifyPayLoad(int payloadID, const E_ROB_PAYLOAD& payloadData);

	/**
	 * 加载负载.
	 * 
	 * \param payloadID 负载号，如果为0表示不加载
	 * \return 成功返回true，失败返回false
	 */
	bool E_LoadPayLoad(int payloadID);

	/**
	 * 获取当前负载变量id号.
	 * 
	 * \return 负载号
	 */
	int E_GetCurPayLoadID();

	/**
	 * 获取负载变量.
	 * 
	 * \param payloadID 负载变量id号
	 * \param payload 负载参数，引用
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetPayLoad(int payloadID, E_ROB_PAYLOAD& payload);

	/**
	 * 设置IO的值.
	 * 
	 * \param IoIndex IoIndex 开始的IO下标
	 * \param IoType IO类型
	 * \param dataIn 要修改的IO值数组指针
	 * \param dataNum 要修改的IO值数组元素个数
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetIOValue(int IoIndex, E_IOType IoType, double* dataIn, int dataNum);

	/**
	 * 获取IO的值.
	 * 
	 * \param IoIndex 开始的IO下标
	 * \param IoType IO类型
	 * \param IoNum 查询IO数量，和数组元素个数一致
	 * \param dataOut 从【IoIndex】开始的【IoNum】个的IO的值数组，数组指针，需要预先申请内存
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetIOValue(int IoIndex, E_IOType IoType, int IoNum, double* dataOut);

	/**
	 * 设置变量.
	 * 
	 * \param varType 变量类型
	 * \param varName 变量名
	 * \param varValue 变量值，字符串类型，需要从其他类型转换
	 * \param varScope 变量域
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetVarValue(E_VarType varType, EstunRobot::ESString varName, EstunRobot::ESString varValue, E_ScopeType varScope);

	/**
	 * 获取变量.
	 * 
	 * \param varType 变量类型
	 * \param varName 变量名
	 * \param varScope 变量域
	 * \param valueBack 变量值，字符串类型，引用类型，需要转换为其他类型
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetVarValue(E_VarType varType, EstunRobot::ESString varName, E_ScopeType varScope, EstunRobot::ESString& valueBack);

	/**
	 * 设置默认到位精度值，掉电保存.
	 * 
	 * \param value 到位精度值
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetFine(double value);

	/**
	 * 获取默认到位精度值.
	 * 
	 * \param value 到位精度值，引用类型
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetFine(double& value);

	/**
	 * 设置点动坐标系类型.
	 * 
	 * \param coordType 坐标系类型
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetJogCoord(E_CoordType coordType);

	/**
	 * 获取点动坐标系类型.
	 * 
	 * \return 坐标系类型
	 */
	E_CoordType E_GetJogCoord();

	/**
	 * 设置jog是否可用.
	 * 
	 * \param isEnable 为true，jog可用，为false，jog不可用
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetJogEnable(bool isEnable);

	/**
	 * 获取jog是否可用.
	 *
	 * \return 可用返回true，不可用返回false
	 */
	bool E_GetJogEnable();

	/**
	 * 点动.
	 * 
	 * \param axisId 值[0,5]，对应关节坐标系下为轴1-6，世界坐标系下为xyzabc
	 * \param distention 运动方向
	 * \param mov 为true运动，为false停止
	 * \return 成功返回true，失败返回false
	 */
	bool E_JogMotion(int axisId, E_DistentionType distention, bool mov);

	/**
	 * 寸动.
	 * 
	 * \param axisId 值[0,5]，对应关节坐标系下为轴1-6，世界坐标系下为xyzabc
	 * \param distention 运动方向
	 * \param dist 寸动距离，单位毫米
	 * \param mov 为true运动，为false停止
	 * \return 成功返回true，失败返回false
	 */
	bool E_JogMicroMotion(int axisId, E_DistentionType distention, double dist, bool mov);

	/**
	 * 示教点.
	 * 
	 * \param pointName 位置点变量名
	 * \param scope 变量域，不能是系统域
	 * \return 成功返回true，失败返回false
	 */
	bool E_TeachPoint(EstunRobot::ESString pointName, E_ScopeType scope);

	/**
	 * 获取机器人类型.
	 * 
	 * \param value 机器人型号
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetRobotType(EstunRobot::ESString& value);

	/**
	 * 获取机器人信息.
	 * 
	 * \param value 机器人信息
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetRobotInfo(EstunRobot::ESString& value);

	/**
	 * 获取机器人状态.
	 * 
	 * \return 12345表示机器人在线，其余为机器人不在线
	 */
	int E_GetRobotStatus();

	/**
	 * 设置全局速度.
	 * 
	 * \param value 速度值[0-100]
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetGlobalSpeed(int value);

	/**
	 * 获取全局速度.
	 * 
	 * \return 速度值,如果为0,可能是全局速度为0,也可能是出错,调用getLastErr获得错误信息
	 */
	int E_GetGlobalSpeed();

	/**
	 * 设置系统模式.
	 * 
	 * \param sysMode 系统模式，目前支支持手动和API，其余设置无效
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetSysMode(E_SysModeType sysMode);

	/**
	 * 获取系统模式.
	 * 
	 * \return 系统模式
	 */
	E_SysModeType E_GetSysMode();

	/**
	 * 设置运动模式.
	 * 
	 * \param mode 运动模式
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetRunMode(E_RunModeType mode);

	/**
	 * 获取运动模式.
	 * 
	 * \return 运动模式
	 */
	E_RunModeType E_GetCurRunMode();

	/**
	 * 设置机器人伺服使能.
	 * 
	 * \param isOn 为true上使能，为false掉使能
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetServoOn(bool isOn);

	/**
	 * 获取机器人伺服是否使能.
	 * 
	 * \return 使能标志
	 */
	E_ServoStatusType E_GetServoOn();

	/**
	 * 清除错误报警.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool E_ClearError();

	/**
	 * 获取错误号.
	 * 
	 * \return 错误号
	 */
	int E_GetErrorId();

	/**
	 * 获取错误内容.
	 * 
	 * \param errorId 错误号
	 * \return 错误详情
	 */
	EstunRobot::ESString E_GetErrorString(int errorId);

	/**
	 * 获取错误内容.
	 *
	 * \param errorId 错误号
	 * \return 错误详情
	 * \language 语言，目前支持ch-中文，en-英文
	 */
	EstunRobot::ESString E_GetErrorString(int errorId, EstunRobot::ESString language/* = "ch"*/);

	/**
	 * 获取当前位置信息，关节坐标系.
	 * 
	 * \return 位置信息，APos
	 */
	E_ROB_POS E_GetCurJPos();

	/**
	 * 获取当前位置信息，世界坐标系.
	 * 
	 * \return 位置信息，CPos
	 */
	E_ROB_POS E_GetCurWPos();

	/**
	 * 设置当前外部坐标系.
	 * 
	 * \param ecpName 外部坐标系变量名，例：t_g.EXTTCP1
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetExternalTCPByName(EstunRobot::ESString ecpName);

	/**
	 * 设置当前外部坐标系.
	 *
	 * \param ecpid 外部坐标系变量id，如果为0表示不加载
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetExternalTCPByID(int ecpid);

	/**
	 * 获取当前加载的程序名.
	 * 
	 * \param value 工程程序名，引用类型
	 * \return 成功返回true，失败返回false
	 */
	bool E_GetCurProgramName(E_ROB_PROGNAME& value);

	/**
	 * 获取当前程序运行状态.
	 * 
	 * \return 程序运行状态
	 */
	E_RunStatusType E_GetCurProgramRunStatus();

	/**
	 * 卸载工程.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool E_UnLoadProject();

	/**
	 * 卸载程序.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool E_UnLoadProgram();

	/**
	 * 只加载工程.
	 * 
	 * \param prjname 工程名
	 * \return 成功返回true，失败返回false
	 */
	bool E_LoadProject(EstunRobot::ESString prjname);

	/**
	 * 加载程序.
	 * 
	 * \param prjname 工程名
	 * \param programname 程序名
	 * \return 成功返回true，失败返回false
	 */
	bool E_LoadProgame(EstunRobot::ESString prjname, EstunRobot::ESString programname);

	/**
	 * 运行程序.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool E_ProgRun();

	/**
	 * 暂停程序.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool E_ProgPause();

	/**
	 * 停止程序.
	 * 
	 * \return 成功返回true，失败返回false
	 */
	bool E_ProgStop();

	/**
	 * 读取Int型变量值.
	 * 
	 * \param varName 变量名称
	 * \param varScope 变量域
	 * \param valueBack 变量值，引用类型
	 * \return 成功返回true，失败返回false
	 */
	bool E_ReadInt(EstunRobot::ESString varName, E_ScopeType varScope, int& valueBack);

	/**
	 * 写入Int型变量值.
	 * 
	 * \param varName 变量名称
	 * \param varScope 变量域
	 * \param value 变量值
	 * \return 成功返回true，失败返回false
	 */
	bool E_WriteInt(EstunRobot::ESString varName, E_ScopeType varScope, int value);

	/**
	 * 读取Double型变量值.
	 * 
	 * \param varName 变量名称
	 * \param varScope 变量域
	 * \param valueBack 变量值，引用类型
	 * \return 成功返回true，失败返回false
	 */
	bool E_ReadReal(EstunRobot::ESString varName, E_ScopeType varScope, double& valueBack);

	/**
	 * 写入Double型变量值.
	 * 
	 * \param varName 变量名称
	 * \param varScope 变量域
	 * \param value 变量值
	 * \return 成功返回true，失败返回false
	 */
	bool E_WriteReal(EstunRobot::ESString varName, E_ScopeType varScope, double value);

	/**
	 * 读取String型变量值.
	 *
	 * \param varName 变量名称
	 * \param varScope 变量域
	 * \param valueBack 变量值，引用类型
	 * \return 成功返回true，失败返回false
	 */
	bool E_ReadStr(EstunRobot::ESString varName, E_ScopeType varScope, EstunRobot::ESString& valueBack);

	/**
	 * 写入String型变量值.
	 *
	 * \param varName 变量名称
	 * \param varScope 变量域
	 * \param value 变量值
	 * \return 成功返回true，失败返回false
	 */
	bool E_WriteStr(EstunRobot::ESString varName, E_ScopeType varScope, EstunRobot::ESString value);

	/**
	 * 读取位置类型变量值.
	 *
	 * \param varName 变量名称
	 * \param varScope 变量域
	 * \param valueBack 变量值，引用类型
	 * \return 成功返回true，失败返回false
	 */
	bool E_ReadPos(EstunRobot::ESString varName, E_ScopeType varScope, E_ROB_POS& valueBack);

	/**
	 * 写入位置类型变量值.
	 *
	 * \param varName 变量名称
	 * \param varScope 变量域
	 * \param value 变量值
	 * \return 成功返回true，失败返回false
	 */
	bool E_WritePos(EstunRobot::ESString varName, E_ScopeType varScope, E_ROB_POS value);

	/**
	 * 设置DO的值.
	 * 
	 * \param IoValues IoValues IO值数组指针，+/-代表1/0，数值代表DO下标，例：{-1,2,6,-8}，表示将DO1、DO8设置为0，DO2、DO6设置为1
	 * \param number IoValues IO值数组个数
	 * \return 成功返回true，失败返回false
	 */
	bool E_SetMultiDO(int* IoValues, int number);

	/**
	 * 获取最近一次下发成功的运动指令的信息.
	 * 
	 * \return 运动指令信息
	 */
	E_ROB_JOBID E_GetCurMovCmdJobId();

	/**
	 * 获取最近一次下发成功的运动指令的执行状态.
	 * 
	 * \return -2-错误 -1-未找到，0-运动未完成，1-运动完成,2-暂停，3-结束/运动错误，4-(预留类型)
	 */
	int E_GetCurMovCmdSts();

	/**
	 * 获取指定运动指令执行状态.
	 * 
	 * \param jobID 指定的运动指令信息
	 * \return -2-错误 -1-未找到，0-运动未完成，1-运动完成,2-暂停，3-结束/运动错误，4-(预留类型)
	 */
	int E_GetMovCmdSts(E_ROB_JOBID jobID);

	/**
	 * 接口耗时.
	 *
	 * \return 接口耗时
	 */
	double getLastFuncExecTime();

private:
	/**
	 * 内部接口.
	 * 
	 */
	void sendRequest();
	void recvData(const char* data, size_t bytes_recv);
	void dealRecvMsg(char * data, size_t data_length);

private:
	struct EstunRemoteApiLibPrivate;
	EstunRemoteApiLibPrivate* _p;
};

#endif //ESTUNREMOTEAPILIB_H